package com.gitee.elead.util;

import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;

/**
 * 中文汉字转拼音
 * 
 * @author luopeng
 *
 */
public class ChineseToSpell {

	/**
	 * 获取汉字串拼音首字母，英文字符不变
	 * 
	 * @param chinese 汉字串
	 * @return 汉语拼音首字母
	 */
	public static String getFirstSpell(String chinese) {
		// 用StringBuffer（字符串缓冲）来接收处理的数据
		StringBuffer sb = new StringBuffer();
		// 字符串转换为字截数组
		char[] arr = chinese.toCharArray();
		// 创建转换对象
		HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
		// 转换类型（大写or小写）
		defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
		// 定义中文声调的输出格式
		defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
		for (int i = 0; i < arr.length; i++) {
			// 判断是否是汉子字符
			if (arr[i] > 128) {
				try {
					// 提取汉字的首字母
					String[] temp = PinyinHelper.toHanyuPinyinStringArray(arr[i], defaultFormat);
					if (temp != null) {
						sb.append(temp[0].charAt(0));
					}
				} catch (BadHanyuPinyinOutputFormatCombination e) {
					e.printStackTrace();
				}
			} else {
				// 如果不是汉字字符，直接拼接
				sb.append(arr[i]);
			}
		}
		return sb.toString().replaceAll("\\W", "").trim();
	}

	/**
	 * 将字符串中的中文转化为拼音,其他字符不变
	 * 
	 * @param inputString
	 * @return 汉语拼音
	 */
	public static String getPingYin(String inputString) {

		// 创建转换对象
		HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
		// 转换类型（大写or小写）
		format.setCaseType(HanyuPinyinCaseType.LOWERCASE);
		// 定义中文声调的输出格式
		format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
		// 定义字符的输出格式
		format.setVCharType(HanyuPinyinVCharType.WITH_U_AND_COLON);

		// 转换为字节数组
		char[] input = inputString.trim().toCharArray();
		// 用StringBuffer（字符串缓冲）来接收处理的数据
		StringBuffer output = new StringBuffer();

		try {
			for (int i = 0; i < input.length; i++) {
				// 判断是否是一个汉子字符
				if (java.lang.Character.toString(input[i]).matches("[\\u4E00-\\u9FA5]+")) {
					String[] temp = PinyinHelper.toHanyuPinyinStringArray(input[i], format);
					output.append(temp[0]);
				} else {
					// 如果不是汉字字符，直接拼接
					output.append(java.lang.Character.toString(input[i]));
				}
			}
		} catch (BadHanyuPinyinOutputFormatCombination e) {
			e.printStackTrace();
		}
		return output.toString();
	}

	/**
	 * 获取汉字串拼音，英文字符不变 【首字母大写】
	 * 
	 * @param chinese 汉字串
	 * @return 汉语拼音
	 */
	public static String getFullSpell(String chinese) {
		// 用StringBuffer（字符串缓冲）来接收处理的数据
		StringBuffer sb = new StringBuffer();
		// 字符串转换字节数组
		char[] arr = chinese.toCharArray();
		HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
		// 转换类型（大写or小写）
		defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
		// 定义中文声调的输出格式
		defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
		// 定义字符的输出格式
		defaultFormat.setVCharType(HanyuPinyinVCharType.WITH_U_AND_COLON);
		for (int i = 0; i < arr.length; i++) {
			// 判断是否是汉子字符
			if (arr[i] > 128) {
				try {
					sb.append(capitalize(PinyinHelper.toHanyuPinyinStringArray(arr[i], defaultFormat)[0]));
				} catch (BadHanyuPinyinOutputFormatCombination e) {
					e.printStackTrace();
				}
			} else {
				// 如果不是汉字字符，直接拼接
				sb.append(arr[i]);
			}
		}
		return sb.toString();
	}

	/**
	 * 将字符串转换成ASCII码
	 * 
	 * @param cnStr
	 * @return String
	 */
	public static String getCnASCII(String cnStr) {
		StringBuffer strBuf = new StringBuffer();
		// 将字符串转换成字节序列
		byte[] bGBK = cnStr.getBytes();
		for (int i = 0; i < bGBK.length; i++) {
			// 将每个字符转换成ASCII码
			strBuf.append(Integer.toHexString(bGBK[i] & 0xff));
		}
		return strBuf.toString();
	}

	/**
	 * 首字母大写
	 * 
	 * @param str
	 * @return
	 */
	public static String capitalize(String str) {
		char ch[];
		ch = str.toCharArray();
		if (ch[0] >= 'a' && ch[0] <= 'z') {
			ch[0] = (char) (ch[0] - 32);
		}
		String newString = new String(ch);
		return newString;
	}
}
